package com.limao.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.limao.CacheManager.CrowdOrderCache;
import com.limao.CacheManager.CrowdSysProjectCache;
import com.limao.CacheManager.CrowdUserAuthCache;
import com.limao.DBDataClass.CrowdSysProjectClass;
import com.limao.DBDataClass.CrowdUserAuthClass;
import com.limao.Model.LzPluginException;
import com.limao.Tool.CacheClass;
import com.limao.Utils.OrderPayParm;
import com.limao.dataEnum.OnlinePayEnum;
import com.unionpay.acp.demo.DemoBase;
import com.unionpay.acp.sdk.AcpService;
import com.unionpay.acp.sdk.LogUtil;
import com.unionpay.acp.sdk.SDKConfig;

@WebServlet(name="PcWebPayServlet", urlPatterns="/PcWebPayServlet",asyncSupported=true)
public class PcWebPayServlet extends HttpServlet{

	private static final long serialVersionUID = 3213148516898322572L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
			request.setCharacterEncoding("UTF-8");
			
			HttpSession session=request.getSession();
			if(CacheClass.getIntValue(CacheClass.getSYS_BaseDataCacheManager().Load_Param("ispaused"))==1)
			{
				if(CacheClass.Maintenance_Start_time==0) 
					CacheClass.Maintenance_Start_time=CacheClass.getTime();
				
				int timel=CacheClass.getIntValue(CacheClass.getSYS_BaseDataCacheManager().Load_Param("pausedtime"));
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('系统维护中！');</script>");
				return ;
			}
			else
				CacheClass.Maintenance_Start_time=0;
			
			String userid=CacheClass.isLogin(request,response);
			
			if(CacheClass.isEmpty(userid))
			{
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('您还未登陆！');</script>");
				return ;
			}

		  
			//前台页面传过来的
			String projectidList = request.getParameter("projectid");
			String selectextraList = request.getParameter("selectextra");
			String numList = request.getParameter("num");
			String about = request.getParameter("about");
			String paytypeStr = request.getParameter("paytype");
			String address= request.getParameter("address");
			address = new String(address.getBytes("iso-8859-1"),"utf-8");
			String shengid= request.getParameter("shengid");
			String cityid= request.getParameter("cityid");
			
			int paytype=CacheClass.getIntValue(paytypeStr);
			

			if (CacheClass.isEmpty(projectidList) || CacheClass.isEmpty(selectextraList)  || CacheClass.isEmpty(numList)
					|| CacheClass.isEmpty(paytypeStr) )
			{
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('内容为空或者参数不正确！');</script>");
				return ;
			}
			
			String[] strIdArr=projectidList.split(",");
			String[] selectextraArr=selectextraList.split("#&");
			String[] strNumArr=numList.split(",");
			
			if(strIdArr.length!=selectextraArr.length || strIdArr.length!=strNumArr.length)
			{
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('参数不正确！');</script>");
				return ;
			}
			
			//取用户数据
			CrowdUserAuthClass user=CrowdUserAuthCache.getInstance().getUser(CacheClass.getIntValue(userid));
			if(user==null )
			{
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('用户不存在！');</script>");
				return ;
			}
			
			float totalrmb=0;
			 //下单前检验
			for(int i=0;1<strIdArr.length;i++)
			{
				if(CacheClass.isEmpty(strIdArr[i]) || CacheClass.getIntValue(strNumArr[i])<=0)
				{
					response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('参数不正确！');</script>");
					return ;
				}
				CrowdSysProjectClass project= CrowdSysProjectCache.getInstance().load_Goods_Info_ById(CacheClass.getIntValue(strIdArr[i]));
				if(project==null)
				{
					response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('项目不存在！');</script>");
					return ;
				}	
				if(!CacheClass.isEmpty(project.extra) && CacheClass.isEmpty(selectextraArr[i]))
				{
					response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('请选择规格！');</script>");
					return ;
				}
				if(CacheClass.getIntValue(project.limitenum)<CacheClass.getIntValue(project.supportnum)+CacheClass.getIntValue(strNumArr[i]))
				{
					response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('商品库存没啦！');</script>");
					return ;
				}
				//计算总价
				totalrmb=totalrmb+CacheClass.getIntValue(strNumArr[i])*CacheClass.getFloatValue(project.packageprice)+CacheClass.getFloatValue(project.frieght);
				
			}
			if(OnlinePayEnum.icard.getIntVlue() == paytype && totalrmb<CacheClass.getFloatValue(user.nowrmb))
			{
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('您的余额不足');</script>");
				return ;
			}
						

			
			//下单
			OrderPayParm tmp=null;
			try {
				tmp = CacheClass.getSYS_OrderCacheManager().Add_Order(CacheClass.getIntValue(userid),strIdArr,strNumArr, selectextraArr, paytype,address,shengid,cityid,0);
			} catch (LzPluginException e) {
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('"+e.getMessage()+"');</script>");
				e.printStackTrace();
				return ;
			}
			if (tmp == null) {
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('数据库操作出错！');</script>");
				return ;
			}
			
			//支付宝pc网页支付
			if(OnlinePayEnum.appliy.getIntVlue() == paytype)
			{
				
			}
			//微信网页支付
			else if(OnlinePayEnum.wx.getIntVlue() == paytype)
			{
				
			}
			//银联网页支付
			else if(OnlinePayEnum.bank.getIntVlue() == paytype)
			{
				unionPcWebPay(request, response,tmp);
			}
			//余额网页支付
			else 
			{
				//余额支付成功后更新相关参数 分成等
				try {
					CrowdOrderCache.getInstance().Deal_Order(tmp.payid);
				} catch (Exception e) {
					e.printStackTrace();
					response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('"+e.getMessage()+"');</script>");
					return ;
				} 
				
				response.getWriter().write("<script charset='UTF-8' type='text/javascript'>alert('购买成功！');</script>");
				return ;
			}
			
			
			
			
			
	}
	
	//银联网页支付
	private void unionPcWebPay(HttpServletRequest request, HttpServletResponse response,OrderPayParm tmp)
	{
		Map<String, String> requestData = new HashMap<String, String>();
		
		
		/***银联全渠道系统，产品参数，除了encoding自行选择外其他不需修改***/
		requestData.put("version", DemoBase.version);   			  //版本号，全渠道默认值
		requestData.put("encoding", DemoBase.encoding_UTF8); 			  //字符集编码，可以使用UTF-8,GBK两种方式
		requestData.put("signMethod", "01");            			  //签名方法，只支持 01：RSA方式证书加密
		requestData.put("txnType", "01");               			  //交易类型 ，01：消费
		requestData.put("txnSubType", "01");            			  //交易子类型， 01：自助消费
		requestData.put("bizType", "000201");           			  //业务类型，B2C网关支付，手机wap支付
		requestData.put("channelType", "07");           			  //渠道类型，这个字段区分B2C网关支付和手机wap支付；07：PC,平板  08：手机
		
		/***商户接入参数***/
		requestData.put("merId", DemoBase.merId);    	          			  //商户号码，请改成自己申请的正式商户号或者open上注册得来的777测试商户号
		requestData.put("accessType", "0");             			  //接入类型，0：直连商户 
		requestData.put("orderId",tmp.order_sn.replace("-", ""));             //商户订单号，8-40位数字字母，不能含“-”或“_”，可以自行定制规则		
		requestData.put("txnTime", DemoBase.getCurrentTime());        //订单发送时间，取系统时间，格式为YYYYMMDDhhmmss，必须取当前时间，否则会报txnTime无效
		requestData.put("currencyCode", "156");         			  //交易币种（境内商户一般是156 人民币）		
		requestData.put("txnAmt", (int)(CacheClass.getFloatValue(tmp.totalrmb) * 100 )+ "");  //交易金额，单位分，不要带小数点
		requestData.put("reqReserved", tmp.payid);        		      //请求方保留域，如需使用请启用即可；透传字段（可以实现商户自定义参数的追踪）本交易的后台通知,对本交易的交易状态查询交易、对账文件中均会原样返回，商户可以按需上传，长度为1-1024个字节		
		
		//前台通知地址 （需设置为外网能访问 http https均可），支付成功后的页面 点击“返回商户”按钮的时候将异步通知报文post到该地址
		//如果想要实现过几秒中自动跳转回商户页面权限，需联系银联业务申请开通自动返回商户权限
		//异步通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
		requestData.put("frontUrl", "http://newpay.91limao.com/"+DemoBase.frontUrl);
		
		//后台通知地址（需设置为【外网】能访问 http https均可），支付成功后银联会自动将异步通知报文post到商户上送的该地址，失败的交易银联不会发送后台通知
		//后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
		//注意:1.需设置为外网能访问，否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码 
		//    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200，那么银联会间隔一段时间再次发送。总共发送5次，每次的间隔时间为0,1,2,4分钟。
		//    5.后台通知地址如果上送了带有？的参数，例如：http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签，否则将会验签失败
		requestData.put("backUrl", "http://newpay.91limao.com/"+DemoBase.backUrl);
		
		
		//////////////////////////////////////////////////
		//
		//       报文中特殊用法请查看 PCwap网关跳转支付特殊用法.txt
		//
		//////////////////////////////////////////////////
		
		/**请求参数设置完毕，以下对请求参数进行签名并生成html表单，将表单写入浏览器跳转打开银联页面**/
		Map<String, String> submitFromData = AcpService.sign(requestData,DemoBase.encoding_UTF8);  //报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
		
		String requestFrontUrl = SDKConfig.getConfig().getFrontRequestUrl();  //获取请求银联的前台地址：对应属性文件acp_sdk.properties文件中的acpsdk.frontTransUrl
		
		String html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData,DemoBase.encoding_UTF8);   //生成自动跳转的Html表单
		
		LogUtil.writeLog("打印请求HTML，此为请求报文，为联调排查问题的依据："+html);
		//将生成的html写到浏览器中完成自动跳转打开银联支付页面；这里调用signData之后，将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改，如果修改会导致验签不通过

		try {
			response.getWriter().write(html);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	
}
